/******************************************************
                  DirectShow .NET
		      netmaster@swissonline.ch
*******************************************************/
//					DsExtend
// Extended streaming interfaces, ported from axextend.idl

using System;
using System.Drawing;
using System.Runtime.InteropServices;

namespace DShowNET
{



	[ComVisible(true), ComImport,
	Guid("93E5A4E0-2D50-11d2-ABFA-00A0C9C6E38D"),
	InterfaceType( ComInterfaceType.InterfaceIsIUnknown )]
public interface ICaptureGraphBuilder2
{
		[PreserveSig]
	int SetFiltergraph( [In] IGraphBuilder pfg );

		[PreserveSig]
	int GetFiltergraph( [Out] out IGraphBuilder ppfg );

		[PreserveSig]
	int SetOutputFileName(
		[In]											ref Guid		pType,
		[In, MarshalAs(UnmanagedType.LPWStr)]			string			lpstrFile,
		[Out]										out IBaseFilter		ppbf,
		[Out]										out IFileSinkFilter	ppSink );

		[PreserveSig]
	int FindInterface(
		[In]											ref Guid		pCategory,
		[In]											ref Guid		pType,
		[In]											IBaseFilter		pbf,
		[In]											ref Guid		riid,
		[Out, MarshalAs(UnmanagedType.IUnknown) ]		out	object		ppint );

		[PreserveSig]
	int RenderStream(
		[In]										ref Guid		pCategory,
		[In]										ref Guid		pType,
		[In, MarshalAs(UnmanagedType.IUnknown)]			object			pSource,
		[In]											IBaseFilter		pfCompressor,
		[In]											IBaseFilter		pfRenderer );

		[PreserveSig]
	int ControlStream(
		[In]											ref Guid		pCategory,
		[In]											ref Guid		pType,
		[In]											IBaseFilter		pFilter,
		[In]											long			pstart,
		[In]											long			pstop,
		[In]											short			wStartCookie,
		[In]											short			wStopCookie );

		[PreserveSig]
	int AllocCapFile(
		[In, MarshalAs(UnmanagedType.LPWStr)]			string			lpstrFile,
		[In]											long			dwlSize );

		[PreserveSig]
	int CopyCaptureFile(
		[In, MarshalAs(UnmanagedType.LPWStr)]			string			lpwstrOld,
		[In, MarshalAs(UnmanagedType.LPWStr)]			string			lpwstrNew,
		[In]											int							fAllowEscAbort,
		[In]											IAMCopyCaptureFileProgress	pFilter );


		[PreserveSig]
	int FindPin(
		[In]											object			pSource,
		[In]											int				pindir,
		[In]										ref Guid			pCategory,
		[In]										ref Guid			pType,
		[In, MarshalAs(UnmanagedType.Bool) ]			bool			fUnconnected,
		[In]											int				num,
		[Out]										out IPin			ppPin );
}





	[ComVisible(true), ComImport,
	Guid("56a868a9-0ad4-11ce-b03a-0020af0ba770"),
	InterfaceType( ComInterfaceType.InterfaceIsIUnknown )]
public interface IGraphBuilder
{
	#region "IFilterGraph Methods"
			[PreserveSig]
		int AddFilter(
			[In] IBaseFilter pFilter,
			[In, MarshalAs(UnmanagedType.LPWStr)]			string			pName );

			[PreserveSig]
		int RemoveFilter( [In] IBaseFilter pFilter );

			[PreserveSig]
		int EnumFilters( [Out] out IEnumFilters ppEnum );

			[PreserveSig]
		int FindFilterByName(
			[In, MarshalAs(UnmanagedType.LPWStr)]			string			pName,
			[Out]										out IBaseFilter		ppFilter );

			[PreserveSig]
		int ConnectDirect( [In] IPin ppinOut, [In] IPin ppinIn,
			[In, MarshalAs(UnmanagedType.LPStruct)]			AMMediaType	pmt );

			[PreserveSig]
		int Reconnect( [In] IPin ppin );

			[PreserveSig]
		int Disconnect( [In] IPin ppin );

			[PreserveSig]
		int SetDefaultSyncSource();
	#endregion

		[PreserveSig]
	int Connect( [In] IPin ppinOut, [In] IPin ppinIn );

		[PreserveSig]
	int Render( [In] IPin ppinOut );

		[PreserveSig]
	int RenderFile(
		[In, MarshalAs(UnmanagedType.LPWStr)]			string			lpcwstrFile,
		[In, MarshalAs(UnmanagedType.LPWStr)]			string			lpcwstrPlayList );

		[PreserveSig]
	int AddSourceFilter(
		[In, MarshalAs(UnmanagedType.LPWStr)]			string			lpcwstrFileName,
		[In, MarshalAs(UnmanagedType.LPWStr)]			string			lpcwstrFilterName,
		[Out]										out IBaseFilter		ppFilter );

		[PreserveSig]
	int SetLogFile( IntPtr hFile );

		[PreserveSig]
	int Abort();

		[PreserveSig]
	int ShouldOperationContinue();
}







// ---------------------------------------------------------------------------------------


	[ComVisible(true), ComImport,
	Guid("a2104830-7c70-11cf-8bce-00aa00a3f1a6"),
	InterfaceType( ComInterfaceType.InterfaceIsIUnknown )]
public interface IFileSinkFilter
{
	[PreserveSig]
	int SetFileName(
		[In, MarshalAs(UnmanagedType.LPWStr)]			string		pszFileName,
		[In, MarshalAs(UnmanagedType.LPStruct)]			AMMediaType	pmt );
	
	[PreserveSig]
	int GetCurFile(
		[Out, MarshalAs(UnmanagedType.LPWStr) ]		out	string		pszFileName,
		[Out, MarshalAs(UnmanagedType.LPStruct) ]		AMMediaType pmt );
}

	[ComVisible(true), ComImport,
	Guid("00855B90-CE1B-11d0-BD4F-00A0C911CE86"),
	InterfaceType( ComInterfaceType.InterfaceIsIUnknown )]
	public interface IFileSinkFilter2
	{
		[PreserveSig]
		int SetFileName(
			[In, MarshalAs(UnmanagedType.LPWStr)]			string		pszFileName,
			[In, MarshalAs(UnmanagedType.LPStruct)]			AMMediaType	pmt );
	
		[PreserveSig]
		int GetCurFile(
			[Out, MarshalAs(UnmanagedType.LPWStr) ]		out	string		pszFileName,
			[Out, MarshalAs(UnmanagedType.LPStruct) ]		AMMediaType pmt );

		[PreserveSig]
		int SetMode( [In] int dwFlags );

		[PreserveSig]
		int GetMode( [Out] out int dwFlags );

	}





// ---------------------------------------------------------------------------------------

	[ComVisible(true), ComImport,
	Guid("670d1d20-a068-11d0-b3f0-00aa003761c5"),
	InterfaceType( ComInterfaceType.InterfaceIsIUnknown )]
public interface IAMCopyCaptureFileProgress
{
		[PreserveSig]
	int Progress( int iProgress );
}








// ---------------------------------------------------------------------------------------

	[ComVisible(true), ComImport,
	Guid("e46a9787-2b71-444d-a4b5-1fab7b708d6a"),
	InterfaceType( ComInterfaceType.InterfaceIsIUnknown )]
public interface IVideoFrameStep
{
		[PreserveSig]
	int Step( int dwFrames,
		[In, MarshalAs(UnmanagedType.IUnknown)]			object			pStepObject );

		[PreserveSig]
	int CanStep( int bMultiple,
		[In, MarshalAs(UnmanagedType.IUnknown)]			object			pStepObject );

		[PreserveSig]
	int CancelStep();
}








// ---------------------------------------------------------------------------------------

	[ComVisible(true), ComImport,
	Guid("C6E13340-30AC-11d0-A18C-00A0C9118956"),
	InterfaceType( ComInterfaceType.InterfaceIsIUnknown )]
public interface IAMStreamConfig
{
		[PreserveSig]
	int SetFormat(
		[In, MarshalAs(UnmanagedType.LPStruct)]			AMMediaType	pmt );

		[PreserveSig]
	int GetFormat(
		[Out] out IntPtr	pmt );

		[PreserveSig]
	int GetNumberOfCapabilities( out int piCount, out int piSize );

		[PreserveSig]
	int GetStreamCaps( int iIndex,
		//[Out, MarshalAs(UnmanagedType.LPStruct)]	out AMMediaType	ppmt,
		[Out] out IntPtr pmt,
		[In]									IntPtr		pSCC );
    }














// =============================================================================
//											TUNER
// =============================================================================

	[ComVisible(false)]
public enum AMTunerSubChannel
{
	NoTune		= -2,	// AMTUNER_SUBCHAN_NO_TUNE : don't tune
	Default		= -1	// AMTUNER_SUBCHAN_DEFAULT : use default sub chan
}

	[ComVisible(false)]
public enum AMTunerSignalStrength
{
	NA				= -1,	// AMTUNER_HASNOSIGNALSTRENGTH : cannot indicate signal strength
	NoSignal		= 0,	// AMTUNER_NOSIGNAL : no signal available
	SignalPresent	= 1		// AMTUNER_SIGNALPRESENT : signal present
}

	[Flags, ComVisible(false)]
public enum AMTunerModeType
{
	Default		= 0x0000,	// AMTUNER_MODE_DEFAULT : default tuner mode
	TV			= 0x0001,	// AMTUNER_MODE_TV : tv
	FMRadio		= 0x0002,	// AMTUNER_MODE_FM_RADIO : fm radio
	AMRadio		= 0x0004,	// AMTUNER_MODE_AM_RADIO : am radio
	Dss			= 0x0008	// AMTUNER_MODE_DSS : dss
}

	[ComVisible(false)]
public enum AMTunerEventType
{
	Changed		= 0x0001,	// AMTUNER_EVENT_CHANGED : status changed
}


// ---------------------------------------------------------------------------------------

	[ComVisible(true), ComImport,
	Guid("211A8761-03AC-11d1-8D13-00AA00BD8339"),
	InterfaceType( ComInterfaceType.InterfaceIsIUnknown )]
public interface IAMTuner
{
		[PreserveSig]
	int put_Channel( int lChannel, AMTunerSubChannel lVideoSubChannel, AMTunerSubChannel lAudioSubChannel );

		[PreserveSig]
	int get_Channel( out int plChannel, out int plVideoSubChannel, out int plAudioSubChannel );
    
		[PreserveSig]
	int ChannelMinMax( out int lChannelMin, out int lChannelMax );
        
		[PreserveSig]
	int put_CountryCode( int lCountryCode );

		[PreserveSig]
	int get_CountryCode( out int plCountryCode );

		[PreserveSig]
	int put_TuningSpace( int lTuningSpace );

		[PreserveSig]
	int get_TuningSpace( out int plTuningSpace );

		[PreserveSig]
	int Logon( IntPtr hCurrentUser );
    
		[PreserveSig]
	int Logout();

		[PreserveSig]
	int SignalPresent( out AMTunerSignalStrength plSignalStrength );
    
		[PreserveSig]
	int put_Mode( AMTunerModeType lMode );

		[PreserveSig]
	int get_Mode( out AMTunerModeType plMode );
    
		[PreserveSig]
	int GetAvailableModes( out AMTunerModeType plModes );
    
		[PreserveSig]
	int RegisterNotificationCallBack( IAMTunerNotification pNotify, AMTunerEventType lEvents );

		[PreserveSig]
	int UnRegisterNotificationCallBack( IAMTunerNotification pNotify );
}


// ---------------------------------------------------------------------------------------

	[ComVisible(true), ComImport,
	Guid("211A8760-03AC-11d1-8D13-00AA00BD8339"),
	InterfaceType( ComInterfaceType.InterfaceIsIUnknown )]
public interface IAMTunerNotification
{
		[PreserveSig]
	int OnEvent( AMTunerEventType Event );
}


// ---------------------------------------------------------------------------------------
	[Flags, ComVisible(false)]
public enum AnalogVideoStandard
{
	None		= 0x00000000,  // This is a digital sensor
	NTSC_M		= 0x00000001,  //        75 IRE Setup
	NTSC_M_J	= 0x00000002,  // Japan,  0 IRE Setup
	NTSC_433	= 0x00000004,
	PAL_B		= 0x00000010,
	PAL_D		= 0x00000020,
	PAL_G		= 0x00000040,
	PAL_H		= 0x00000080,
	PAL_I		= 0x00000100,
	PAL_M		= 0x00000200,
	PAL_N		= 0x00000400,
	PAL_60		= 0x00000800,
	SECAM_B		= 0x00001000,
	SECAM_D		= 0x00002000,
	SECAM_G		= 0x00004000,
	SECAM_H		= 0x00008000,
	SECAM_K		= 0x00010000,
	SECAM_K1	= 0x00020000,
	SECAM_L		= 0x00040000,
	SECAM_L1	= 0x00080000,
	PAL_N_COMBO	= 0x00100000	// Argentina
}

	[ComVisible(false)]
public enum TunerInputType
{
	Cable,
	Antenna
}


// ---------------------------------------------------------------------------------------

	[ComVisible(true), ComImport,
	Guid("211A8766-03AC-11d1-8D13-00AA00BD8339"),
	InterfaceType( ComInterfaceType.InterfaceIsIUnknown )]
public interface IAMTVTuner
{

	#region "IAMTuner Methods"
			[PreserveSig]
		int put_Channel( int lChannel, AMTunerSubChannel lVideoSubChannel, AMTunerSubChannel lAudioSubChannel );

			[PreserveSig]
		int get_Channel( out int plChannel, out int plVideoSubChannel, out int plAudioSubChannel );
	    
			[PreserveSig]
		int ChannelMinMax( out int lChannelMin, out int lChannelMax );
	        
			[PreserveSig]
		int put_CountryCode( int lCountryCode );

			[PreserveSig]
		int get_CountryCode( out int plCountryCode );

			[PreserveSig]
		int put_TuningSpace( int lTuningSpace );

			[PreserveSig]
		int get_TuningSpace( out int plTuningSpace );

			[PreserveSig]
		int Logon( IntPtr hCurrentUser );
	    
			[PreserveSig]
		int Logout();

			[PreserveSig]
		int SignalPresent( out AMTunerSignalStrength plSignalStrength );
	    
			[PreserveSig]
		int put_Mode( AMTunerModeType lMode );

			[PreserveSig]
		int get_Mode( out AMTunerModeType plMode );
	    
			[PreserveSig]
		int GetAvailableModes( out AMTunerModeType plModes );
	    
			[PreserveSig]
		int RegisterNotificationCallBack( IAMTunerNotification pNotify, AMTunerEventType lEvents );

			[PreserveSig]
		int UnRegisterNotificationCallBack( IAMTunerNotification pNotify );
	#endregion

		[PreserveSig]
	int get_AvailableTVFormats( out AnalogVideoStandard lAnalogVideoStandard );

		[PreserveSig]
	int get_TVFormat( out AnalogVideoStandard lAnalogVideoStandard );
    
		[PreserveSig]
	int AutoTune( int lChannel, out int plFoundSignal );
    
		[PreserveSig]
	int StoreAutoTune();
    
		[PreserveSig]
	int get_NumInputConnections( out int plNumInputConnections );
    
		[PreserveSig]
	int put_InputType( int lIndex, TunerInputType inputType );
    
		[PreserveSig]
	int get_InputType( int lIndex, out TunerInputType inputType );

		[PreserveSig]
	int put_ConnectInput( int lIndex );
    
		[PreserveSig]
	int get_ConnectInput( out int lIndex );

		[PreserveSig]
	int get_VideoFrequency( out int lFreq );

		[PreserveSig]
	int get_AudioFrequency( out int lFreq );
}

	// ---------------------------------------------------------------------------------------
	[ComVisible(true), ComImport,
	Guid("C6E13380-30AC-11d0-A18C-00A0C9118956"),
	InterfaceType( ComInterfaceType.InterfaceIsIUnknown )]
	public interface IAMCrossbar
	{
		[PreserveSig]
		int get_PinCounts(
				[Out] out int OutputPinCount, 
				[Out] out int InputPinCount );

		[PreserveSig]
		int CanRoute( 
				[In]  int OutputPinIndex, 
				[In]  int InputPinIndex );

		[PreserveSig]
		int Route( 
				[In]  int OutputPinIndex, 
				[In]  int InputPinIndex );

		[PreserveSig]
		int get_IsRoutedTo( 
			[In] int OutputPinIndex, 
			[Out] out int InputPinIndex );

		[PreserveSig]
		int get_CrossbarPinInfo( 
				[In, MarshalAs(UnmanagedType.Bool)]	bool IsInputPin, 
				[In]  int PinIndex,
				[Out] out int PinIndexRelated,
				[Out] out PhysicalConnectorType PhysicalType
				);
	}

	// ---------------------------------------------------------------------------------------
	[ComVisible(true), ComImport,
	Guid("54C39221-8380-11d0-B3F0-00AA003761C5"),
	InterfaceType( ComInterfaceType.InterfaceIsIUnknown )]
	public interface IAMAudioInputMixer
	{
		// This interface is only supported by the input pins, not the filter
		// If disabled, this channel will not be mixed in as part of the
		// recorded signal.
		int put_Enable (
			[In] bool fEnable);	// TRUE=enable FALSE=disable

		//Is this channel enabled?
		int get_Enable (
			[Out] out bool pfEnable);

		// When set to mono mode, making a stereo recording of this channel
		// will have both channels contain the same data... a mixture of the
		// left and right signals
		int put_Mono (
			[In] bool fMono);	// TRUE=mono FALSE=multi channel

		//all channels combined into a mono signal?
		int get_Mono (
			[Out] out bool pfMono);

		// !!! WILL CARDS BE ABLE TO BOOST THE GAIN?
		//Set the record level for this channel
		int put_MixLevel (
			[In] double Level);	// 0 = off, 1 = full (unity?) volume
		// AMF_AUTOMATICGAIN, if supported,
		// means automatic

		//Get the record level for this channel
		int get_MixLevel (
			[Out] out double pLevel);

		// For instance, when panned full left, and you make a stereo recording
		// of this channel, you will record a silent right channel.
		int put_Pan (
			[In] double Pan);	// -1 = full left, 0 = centre, 1 = right

		//Get the pan for this channel
		int get_Pan (
			[Out] out double pPan);

		// Boosts the bass of low volume signals before they are recorded
		// to compensate for the fact that your ear has trouble hearing quiet
		// bass sounds
		int put_Loudness (
			[In] bool fLoudness);// TRUE=on FALSE=off

		int get_Loudness (
			[Out] out bool pfLoudness);

		// boosts or cuts the treble of the signal before it's recorded by
		// a certain amount of dB
		int put_Treble (
			[In] double Treble); // gain in dB (-ve = attenuate)

		//Get the treble EQ for this channel
		int get_Treble (
			[Out] out double pTreble);

		// This is the maximum value allowed in put_Treble.  ie 6.0 means
		// any value between -6.0 and 6.0 is allowed
		int get_TrebleRange (
			[Out] out double pRange); // largest value allowed

		// boosts or cuts the bass of the signal before it's recorded by
		// a certain amount of dB
		int put_Bass (
			[In] double Bass); // gain in dB (-ve = attenuate)

		// Get the bass EQ for this channel
		int get_Bass (
			[Out] out double pBass);

		// This is the maximum value allowed in put_Bass.  ie 6.0 means
		// any value between -6.0 and 6.0 is allowed
		int get_BassRange (
			[Out] out double pRange); // largest value allowed
	}

	// ---------------------------------------------------------------------------------------
	public enum VfwCompressDialogs
	{
		Config = 0x01,
		About =  0x02,
		QueryConfig = 0x04,
		QueryAbout =  0x08
	}

	// ---------------------------------------------------------------------------------------
	[ComVisible(true), ComImport,
	Guid("D8D715A3-6E5E-11D0-B3F0-00AA003761C5"),
	InterfaceType( ComInterfaceType.InterfaceIsIUnknown )]
	public interface IAMVfwCompressDialogs
	{
		[PreserveSig]
			// Bring up a dialog for this codec
		int ShowDialog(
			[In]  VfwCompressDialogs	iDialog,
			[In]  IntPtr				hwnd );

		// Calls ICGetState and gives you the result
		int GetState(
			[Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex=1)] byte[] pState,
			ref int pcbState );

		// Calls ICSetState
		int SetState(
			[In, MarshalAs(UnmanagedType.LPArray, SizeParamIndex=1)] byte[] pState,
			[In] int cbState );

		// Send a codec specific message
		int SendDriverMessage(
			int uMsg,
			long dw1,
			long dw2 );
	}


	// ---------------------------------------------------------------------------------------
	[StructLayout(LayoutKind.Sequential), ComVisible(false)]
	public class VideoStreamConfigCaps		// VIDEO_STREAM_CONFIG_CAPS
	{
		public Guid			Guid;
		public AnalogVideoStandard	    VideoStandard;
		public Size			InputSize;
		public Size			MinCroppingSize;
		public Size			MaxCroppingSize;
		public int			CropGranularityX;
		public int			CropGranularityY;
		public int			CropAlignX;
		public int			CropAlignY;
		public Size			MinOutputSize;
		public Size			MaxOutputSize;
		public int			OutputGranularityX;
		public int			OutputGranularityY;
		public int			StretchTapsX;
		public int			StretchTapsY;
		public int			ShrinkTapsX;
		public int			ShrinkTapsY;
		public long			MinFrameInterval;
		public long			MaxFrameInterval;
		public int			MinBitsPerSecond;
		public int			MaxBitsPerSecond;
	}

	// ---------------------------------------------------------------------------------------
	[StructLayout(LayoutKind.Sequential), ComVisible(false)]
	public class AudioStreamConfigCaps  // AUDIO_STREAM_CONFIG_CAPS
	{
		public Guid	Guid;
		public int	MinimumChannels;
		public int	MaximumChannels;
		public int	ChannelsGranularity;
		public int	MinimumBitsPerSample;
		public int	MaximumBitsPerSample;
		public int	BitsPerSampleGranularity;
		public int	MinimumSampleFrequency;
		public int	MaximumSampleFrequency;
		public int	SampleFrequencyGranularity;
	}


} // namespace DShowNET
